home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Everything For A Hacker
/
19990506-[HACK].iso
/
HEXEDIT
/
UTILS
/
80X0393.ARJ
/
VIDTYPE.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-03-30
|
37KB
|
1,111 lines
comment *
Author:
Yousuf J. Khan
Purpose:
To detect what type of video adapter is installed.
Note:
Work was based on source code inside Richard Wilton's
"Programmer's Guide to PC & PS/2 Video Systems" book. However
it's been heavily reworked to a more (dare I say?)
understandable format. Also Super VGA tests were put in,
something completely missing from Wilton's book.
*
.model tiny
;.stack 200h
.data
std0type db 0 ;first video subsystem type
ext0type db 0 ;extended info on first subsystem
std1type db 0 ;second video subsystem type
ext1type db 0 ;extended info on second subsystem
vidflag record monofound:1,colorfound:1
egatype vidflag <0,0> ;Was a mono or color EGA found?
;
;video adapter codes (based on codes returned by VGA BIOS DC codes):
;-these codes are used when a VGA BIOS is not found and other tests
; need to be performed to determine video type
;-it was decided to use the VGA BIOS DC codes for simplicity
;-see findVGA procedure for list of VGA DCCs.
;
NoDISP equ 0 ;no display
MONO equ 1
CGA equ 2
cEGA equ 4 ;color EGA
mEGA equ 5 ;mono EGA
.code
org 100h ;*.COM start offset
start:
call findVGA ;look for a VGA or MCGA
comment \
After executing VGA BIOS routines, the VGA BIOS itself will have
done all the work of determining what is installed so no need to
do any further tests. The "findVGA" subprocedure will set the CF
upon returning, if a VGA BIOS was found.
\
jc endtests ;found VGA/MCGA, end of tests
call findEGA ;look for an EGA
call findCGA ;look for a CGA
call findMono ;look for an MDA or HGC
endtests:
call write_msg ;write found info to screen, set
; errorlevel
mov ah, 4ch ;end program
int 21h
findVGA proc
comment *
Purpose:
determine if a MCGA/VGA/SVGA display is installed
Entry:
nothing
Return:
CF set if found, clear if not
*
mov ax, 1A00h ;get Displ Combo Code info
int 10h
cmp al, 1Ah ;VGA-only BIOS function
jne noVGA ; not supported => no VGA
comment \
Upon Return from Int 10h, AX=1A00h:
BL=primary adapter DCC
BH=secondary adapter DCC
Values for display combination code:
00h no display
01h monochrome adapter w/ monochrome display
02h CGA w/ color display
03h reserved
04h EGA w/ color display
05h EGA w/ monochrome display
06h PGA w/ color display
07h VGA w/ monochrome analog display
08h VGA w/ color analog display
09h reserved
0Ah MCGA w/ digital color display
0Bh MCGA w/ monochrome analog display
0Ch MCGA w/ color analog display
FFh unknown display type
\
push bx ;interpretDCC destroys contents of BH
call interpretDCC ;this proc looks for extended info
mov [std0type], bl ;save normal info
mov [ext0type], bh ;save extended info
pop bx
push bx
;Since proc interpretDCC only works on info in BL, we must
; exchange BL with BH.
xchg bh, bl
call interpretDCC
mov [std1type], bl ;save normal info
mov [ext1type], bh ;save extended info
pop bx
stc ;found VGA/MCGA, so set CF before ret
jmp endVGAtest
noVGA:
clc
endVGAtest:
ret
interpretDCC proc
comment *
Purpose:
Interprets information returned by the DCC
Upon Entry:
BL=normal DCC of desired video subsystem
BH=will be destroyed, replaced with ext code
Upon Return:
BL=normal DCC returned (MDA,CGA,EGA,PGA,MCGA,VGA,etc)
BH=extended code (HGC,SVGA), 0 if none
*
mov bh, 0 ;Assume no extended attribs
cmp bl, 0 ;If 0, then no display card
je end_interpret
cmp bl, 1 ;Mono
je monotests
jmp CGAtests
monotests:
;
;If we find a monochrome adapter, then we need to do special
; further tests to see if we have just an MDA or one of the
; Hercules cards.
;
mov bh, bl ;save normal DCC in BH
call findHGC ;MDA or HGC? value returned in
; BL
xchg bh, bl ;BL=normal,BH=extended
jmp end_interpret
CGAtests:
cmp bl, 2 ;CGA
je end_interpret
cmp bl, 6 ;EGA or PGA
jbe end_interpret
cmp bl, 8 ;BL=7,8: VGA
ja end_interpret
;
;If we find a VGA, then we need to do extra tests to see whose
; VGA chipset it is.
;
mov bh, bl ;save BL in BH
call findSVGA ;search for SVGA adapter
xchg bh, bl ;BH=extended, BL=normal
end_interpret:
ret
endp
endp
findSVGA proc
comment *
Purpose:
To search for specific SVGA types, including VESA compatibility.
Entry:
Nothing
Return:
BL=SVGA type
*
comment \
List of SVGA types:
Brand Type
----- ----
ATI 1─┐
Ahead 2 │ These chipsets all have
Paradise 3 │ easily identifiable BIOS based
Oak 4 │ identification methods.
Genoa 5─┘
Cirrus 6─┐
Chips&Tech 7 │ These chipsets require complicated
Tseng 8 │ register twiddlings to identify
ZyMos 9 │ their presense.
Trident 10─┘
8514/A 11 -checks for HDILOAD.EXE only
If a VESA BIOS is present, then add 128 to errorlevels.
Note: The BIOS based id strings were obtained from Ralf Brown's
PD DOS Interrupts list (INTER32).
The register level chipset tests were obtained through various
sources, including John Bridges' VGAKIT 5.0, and Andrew
Rossmann's INFOPLUS 1.55 source code. However, both gentlemen
appear to have gotten their info through the book "Advanced
Programmer's Guide to Super VGAs", by George Sutty and Steve
Blair. So lay credit wherever you like.
\
noSVGA equ 0
mov bl, noSVGA ;initially assume no SVGA
push es ;save current ES segment
mov ax, 0C000h ;set ES to VBIOS
mov es, ax ; segment (C000h)
;
;now testing for ATI chipset
;
.data
ATIid db "761295520"
idlen = $-ATIid
ATI equ 1
.code
mov di, 31h ;id string offset in ATI VBIOS
mov si, offset ATIid
mov cx, idlen
repe cmpsb ;comp each byte, exit if not matched
jne noATI
mov bl, ATI ;ATI was found
jmp endSVGAtests
noATI:
;
;now testing for Ahead chipset
;
.data
AHEADid db "AHEAD"
idlen = $-AHEADid
AHEAD equ 2
.code
mov di, 25h ;id string offset in AHEAD VBIOS
mov si, offset AHEADid
mov cx, idlen
repe cmpsb ;comp each byte, exit if not matched
jne noAHEAD
mov bl, AHEAD ;AHEAD was found
jmp endSVGAtests
noAHEAD:
;
;now testing for Paradise/WD chipset
;
.data
PDISEid db "VGA="
idlen = $-PDISEid
PDISE equ 3
.code
mov di, 7dh ;id string offset in Pdise VBIOS
mov si, offset PDISEid
mov cx, idlen
repe cmpsb
jne noPDISE
mov bl, PDISE ;Paradise was found
jmp endSVGAtests
noPDISE:
;
;now testing for OAK chipset
;
.data
OAKid db "OAK VGA"
idlen = $-PDISEid
OAK equ 4
.code
mov di, 8 ;id string offset in OAK VBIOS
mov si, offset OAKid
mov cx, idlen
repe cmpsb
jne noOAK
mov bl, OAK ;OAK was found
jmp endSVGAtests
noOAK:
;
;now testing for Genoa chipset
;
;the installation check for Genoa video adapters is the
;signature 77h XXh 99h 66h at C000h:0037h, where XXh is
; 00h for Genoa 6200/6300
; 11h for Genoa 6400/6600
; 22h for Genoa 6100
; 33h for Genoa 5100/5200
; 55h for Genoa 5300/5400
;
.data
GENOAid db 77h,00h,99h,66h
idlen = $-GENOAid
GENOA equ 5
.code
mov di, 37h ;id string offset in OAK VBIOS
mov si, offset GENOAid
mov cx, idlen
repe cmpsb
pushf ;save flags
cmp cx, idlen-2 ;did mismatch occur after 2nd byte?
je contGENOA ;yes? continue test at next byte
popf ;restore flags
jmp discontGENOA
contGENOA:
popf ;restore flags
repe cmpsb ;continue tests where it left off
discontGENOA:
jne noGENOA
mov bl, GENOA
jmp endSVGAtests
noGENOA:
;
;The following chipsets require register tests, and cannot be
; identified through the BIOS:
;
;test for CIRRUS chipset (register)
;
call CIRRUStest
cmp bl, 0 ;if BL=0, Cirrus wasn't found
jne endSVGAtests
;
;test for ZyMos chipset (register)
;
call ZYMOStest
cmp bl, 0 ;C&T was not found
jne endSVGAtests
;
;test for TSENG chipset (register)
;
call TSENGtest
cmp bl, 0 ;Tseng was not found
jne endSVGAtests
;
;test for Trident chipset (register)
;
call TridentTest
cmp bl, 0 ;Trident wasn't found
jne endSVGAtests
call Test8514
cmp bl, 0
jne endSVGAtests ;8514/A wasn't found
;
;test for C&T chipset (register)
;
;Note: the C&T test routine has been moved to the end, because
; it seems to cause the most lockups.
;
call CHIPStest
endSVGAtests:
;
;test to see if VESA BIOS is installed
;
.data
VESAbuf db 256 dup(?) ;VESA information buffer
.code
pop es
mov ax, 4f00h
mov di, offset VESAbuf
int 10h ;VESA: get SVGA info
cmp ax, 004fh ;if VESA installed this should work
jne noVESA
;
; If VESABIT of the record, SVGATYPE, is set, then a VESA
; BIOS was found. The rest of the record just records what
; type of SVGA was found, regardless of VESA.
;
svgatype record vesabit:1,svgabits:7
or bl, mask vesabit ;turn on VESAbit, in ext code
noVESA:
ret
CIRRUStest proc
comment *
Purpose:
Register-level test for CIRRUS chipset
Entry:
BH=current normal DCC
Return:
BL=SVGA code
*
CIRRUS equ 6
push bx ;save BH
mov dx, 3B4h;assume DX=mono VGA selection port
cmp bh, 8 ;if BH=8, color; BH=7, mono
je color_cirrus
add dx, 020h;if color, add 20h to select port addr
color_cirrus:
mov al, 0Ch ;Start Addr High register
out dx, al
inc dx ;DX=data port
in al, dx ;read register
mov ah, al ;save
xchg al, ah ;swap back
push ax ;save port value
push dx ;save port addr
xor al, al
out dx, al ;zero Start Addr High reg
dec dx ;back to selection port
mov al, 1Fh
out dx, al ;select special Cirrus ID reg
inc dx ;back to data port
in al, dx ;read ID reg value
mov ah, al ;save it in AH
mov bh, al ;save again in BH
mov dx, 3c4h;addr of special seq'ncr/ext'ns select port
mov al, 6 ;extensions control reg
mov cl, 4 ;get ready to swap the nibbles in AX
ror bh, cl ;nibble swap computes ext reg disable val
mov ax, bx
out dx, ax ;disable extensions
inc dx ;seq/ext data port
in al, dx ;read back enable flag
or al, al ;disabled?
jnz noCIRRUS
dec dx ;seq/ext select port
mov bh, al ;save AL
mov al, 6 ;extensions control reg
out dx, al
inc dx
mov al, ah ;restore ID reg value
out dx, al ;reenable ext regs
in al, dx ;read back ext reg
cmp al, 1 ;enabled?
jne noCIRRUS
ror bh, cl ;nibble swap to compute enable ext reg val
dec dx
mov ax, bx
out dx, ax ;ext enable
inc dx
in al, dx
cmp al, 1
jne noCIRRUS
mov bl, CIRRUS ;CIRRUS was found
noCIRRUS:
pop dx
dec dx ;point select reg
pop ax
out dx, ax ;restore to orig state
pop ax ;restore BH
mov bh, ah
ret
endp
CHIPStest proc
comment *
Purpose:
Register-level test for C&T VGA chipset
Entry:
BH=current normal DCC
Return:
BL=SVGA code
Note:
This particular test appears to lockup my system, with
an ATI VGAWonder card installed, after the first port
write. I have no idea if this lockup is due to the
presence of the ATI or some other component in my
motherboard. So be forewarned: always do the ATI test
first, which is safely BIOS-based, before you do this
test. In fact you might want to save this test for the
last of all the tests you do.
*
CHIPS equ 7
;place VGA in setup mode
cli
mov dx,46e8h ;address of setup control reg
in al,dx
or al,10h ;turn on setup bit
out dx,al ;go to setup mode
;enable extended register bank
mov dx,103h ;extended reg address
in al,dx
or al,80h ;turn enable bit on
out dx,al
;read global ID
mov dx,104h ;global ID reg
in al,dx
mov ah,al ;save
;place vga in normal mode
mov dx,46e8h
in al,dx
and al,03fh
out dx,al
sti
;read version extended register
mov dx,3d6h
mov al,0
out dx,al ;select version register
inc dx
in al,dx
cmp ah,5ah ;check for CTI ID
jne notcti
and al,0f0h ;adjust chip id
shr al,1
shr al,1
shr al,1
shr al,1
cmp al,2 ;only 0, 1 and 3 are good
je notcti
cmp al,4
jge notcti
cmp al,3
je notcti
mov bl, CHIPS ;return SVGA info
notcti:
ret
endp
TSENGtest proc
comment *
Purpose:
Register-level test for Tseng VGA chipset
Entry:
BH=current normal DCC
Return:
BL=SVGA code
*
TSENG equ 8
mov dx,3cdh ;page select reg
in al,dx
mov ah,al ;save
and al,0c0h ;save some bits
or al,55h ;test value one
out dx,al ;write it
in al,dx
cmp al,55h ;same?
jne nottseng
mov al,0aah ;test value two
out dx,al
in al,dx
cmp al,0aah ;same
jne nottseng
mov al,ah ;restore original settings
out dx,al
mov al,1
end_tsengck:
mov bl, TSENG ;found a TSENG
nottseng:
ret
endp
ZYMOStest proc
comment *
Purpose:
Register-level test for ZyMos VGA chipset
Entry:
BH=current normal DCC
Return:
BL=SVGA code
*
ZyMos equ 9
mov dx,3c4h ;extended reg bank
mov al,0bh ;version reg
out dx,al
inc dx
in al,dx ;get version
and al,0fh
cmp al,2
jne end_zymosck ;not found
mov bl, ZyMos ;found one
end_zymosck:
ret
endp
TridentTest proc
comment *
Purpose:
Register level test for Trident VGA chipset
Entry:
BH=current normal DCC
Return:
BL=SVGA code
Note:
-Thanks to John Olson, of Fidonet 1:106/888, of the
Fidonet 80XXX assembly language echo, who supplied this
routine from "Programmer's Guide to the EGA and VGA
Cards", by Richard F. Ferraro.
*
Trident equ 10
MOV DX,3C4H
MOV AL,0EH ; Read mode control #1 Register
OUT DX,AL
INC DX
IN AL,DX ; Read old value
XOR AL,2
PUSH AX
MOV AL,0 ; Write new value bit 1=0, all
;other bits =0
OUT DX,AL
IN AL,DX ; Read new value
AND AL,0FH
CMP AL,2 ; Check for Trident
POP AX ; Old value
OUT DX,AL ; Restore old value
JNZ NOT_T
mov bl, Trident ;found one
not_t:
ret
endp
Test8514 proc
comment *
Purpose:
Installation check for 8514/A's HDILOAD.EXE
Entry:
BH=current normal DCC
Return:
BL=SVGA code
AX,CX,DX destroyed
*
_8514 equ 11
;
;If HDILOAD installed then CX and/or DX will be modified
; as CX:DX->function entry point array
;
mov ax, 105h
mov cx, 0
mov dx, 0
int 7Fh ;installation check
cmp cx, 0 ;if CX didn't change
je no8514
mov bl, _8514
no8514:
ret
endp
endp
findEGA proc
comment *
Purpose:
To find an EGA
*
mov ah, 12h
mov bx, 0FF10h
int 10h ;for EGA BIOS+ only
cmp bh, 0FFh ;if BH remains unchanged
je endEGAtest ; then EGA BIOS not installed
cmp bh, 0 ;BH=0, if color EGA
jne EGAmono
mov [egatype], mask colorfound
mov bl, cEGA ;EGA w/ color disp
mov dx, 3D4h ;color port addr
call determine_subsystem
jmp endEGAtest
EGAmono:
mov [egatype], mask monofound
mov bl, mEGA ;EGA w/ mono disp
mov dx, 3B4h ;mono port addr
call determine_subsystem
endEGAtest:
ret
endp
findCGA proc
comment *
Purpose:
To find a CGA
*
test [egatype], mask colorfound ;is color EGA present?
jne endCGAtest ;yes, then skip test
mov dx, 3D4h ;DX=CGA 6845 CRTC port addr
call find6845
jc endCGAtest ;didn't find CGA
mov bl, CGA ;ie. found CGA
call determine_subsystem
endCGAtest:
ret
endp
findMono proc
comment *
Purpose:
To find a Mono adapter
*
test [egatype], mask monofound ;is mono EGA present?
jne EndMonotest ;yes, then skip test
mov dx, 3B4h ;DX=Mono 6845 CRTC port addr
call find6845
jc EndMonoTest ;didn't find MDA
;
;We've found a mono adapter, now it's time to find out
; if it's a Hercules-compatible monographics adapter.
;
mov bl, MONO ;found MDA
call determine_subsystem
jc mono_is_2nd ;MDA was 2nd system
call findHGC ;is 1st a Herc?
mov [ext0type], bl
jmp EndMonoTest
mono_is_2nd:
call findHGC ;is 2nd a Herc?
mov [ext1type], bl
EndMonoTest:
ret
endp
findHGC proc
comment *
Purpose:
To determine if MDA found is also a Herc of some sort
Enter:
nothing
Return:
BL=Herc type
*
NoHerc equ 0 ;no Hercules
Herc equ 1 ;regular Hercules
HercP equ 2 ;Hercules Plus
HercIC equ 3 ;Hercules InColor
comment \
Hercs are identified from normal MDA by bit 7, vertical
sync, on 6845 Status Port which is changeable only on
Hercs.
Hercs are identified from each other with bits 4-6 in
Status Port. On an regular Herc, they are 000b, on
Herc+, they are 001b, and on InColor, they are 101b.
Each bit is kept track of in the record, HGCStatus.
\
HGCStatus record vsync:1,HGCid:3,miscbits:4
mov dx, 3BAh ;status port
in al, dx
and al, mask vsync
mov ah, al ;store current vsync status in AH
mov cx, 8000h ;loop 32768 times
teststatusbit:
in al, dx
and al, mask vsync
cmp ah, al
loope teststatusbit ;keep looping as long as they are equal
jne HercIDs ;if vsync changed, is a Herc
mov bl, NoHerc ;was not a Herc
jmp EndHercTests
HercIDs:
in al, dx ;read status port again
and al, mask HGCid ;mask all but bits 4-6
cmp al, HGCStatus <0,001b,0> ;indicates HGC+
je isPlus
mov bl, Herc ;is a regular Herc, for now
cmp al, HGCStatus <0,101b,0> ;indicates InColor
jne EndHercTests ;didn't find InColor
mov bl, HercIC ;is an InColor
jmp EndHercTests
isPlus:
mov bl, HercP ;is a Herc Plus (Ramfonts)
EndHercTests:
ret
endp
determine_subsystem proc
comment *
Purpose:
To determine if currently tested subsystem is primary or secondary
Entry:
BL=subsystem DCC value to input in memory
DX=port address to compare against
Return:
CF clear if primary system, set if secondary
*
push ax ;save AX
push es ;save ES
mov ax, 40h ;set ES to
mov es, ax ; BIOS data segment
mov ax, es:[63h] ;AX=active Vid CRTC base addr
cmp ax, dx ;is current = default?
pop es ;restore ES
pop ax ;restore AX
jne _2ndsystem ;if not default, must be 2nd subsystem
mov [std0type], bl ;store as 1st system
clc ;is primary, so clear CF
jmp end_det_sys
_2ndsystem:
mov [std1type], bl ;store as 2nd system
stc ;is secondary, so set CF
end_det_sys:
ret
endp
find6845 proc
comment *
Purpose:
Detect if a 6845-compatible CRTC controller is present at port
address given in DX
Entry:
DX=CRTC base port address to test
Return:
CF clear if successful, set if not
*
push dx
push ax
mov al, 0Fh
out dx, al ;select 6845 reg 0Fh (cursor low)
inc dx
in al, dx ;AL=current cursor low val
mov ah, al ;save AL in AH
mov al, 66h ;AL=set some arbitrary val
out dx, al ;write to 6845
mov cx, 100h
loop $ ;loop 100h times
in al, dx
xchg ah, al ;AH=returned value
;AL=original value
out dx, al ;restore original value
cmp ah, 66h ;did 6845 respond?
je end6845
stc ;set CF if 6845 not there
end6845:
pop ax
pop dx
ret
endp
write_msg proc
comment *
Purpose:
To display video adapter information to Stdout, and return an
errorlevel based on command line parameters.
*
.data
CRLF equ 13,10,"$"
copyright db "VIDTYPE v1.1 (c) 1992, Yousuf J. Khan",CRLF
std_msg db "Standard video information:",CRLF
ext_msg db "Extended video information:",CRLF
vid1msg db "Primary video subsystem:",CRLF
vid2msg db "Secondary video subsystem:",CRLF
;Standard video adapter types (based on VGA BIOS DCCs)
DCC00 db "no display",CRLF
DCC01 db "monochrome adapter w/ monochrome display",CRLF
DCC02 db "CGA w/ color display",CRLF
DCC03 db "reserved",CRLF
DCC04 db "EGA w/ color display",CRLF
DCC05 db "EGA w/ monochrome display",CRLF
DCC06 db "PGA w/ color display",CRLF
DCC07 db "VGA w/ monochrome analog display",CRLF
DCC08 db "VGA w/ color analog display",CRLF
DCC09 db "reserved",CRLF
DCC0A db "MCGA w/ digital color display",CRLF
DCC0B db "MCGA w/ monochrome analog display",CRLF
DCC0C db "MCGA w/ color analog display",CRLF
DCCFF db "unknown display type",CRLF
stdmsgtbl dw DCC00
dw DCC01
dw DCC02
dw DCC03
dw DCC04
dw DCC05
dw DCC06
dw DCC07
dw DCC08
dw DCC09
dw DCC0A
dw DCC0B
dw DCC0C
dw DCCFF
;Extended video adapter types (various Hercs & Super VGAs)
HG equ "Hercules "
SV equ "Super VGA: "
EXT00 db "no extended info available",CRLF
HGC00 db HG,"standard",CRLF
HGC01 db HG,"Plus (Ramfonts)",CRLF
HGC02 db HG,"InColor",CRLF
HGCmsgtbl dw EXT00 ;no Herc
dw HGC00
dw HGC01
dw HGC02
VGA00 db SV,"ATI",CRLF
VGA01 db SV,"AHEAD",CRLF
VGA02 db SV,"Paradise",CRLF
VGA03 db SV,"Oak",CRLF
VGA04 db SV,"Genoa",CRLF
VGA05 db SV,"Cirrus",CRLF
VGA06 db SV,"Chips & Tech",CRLF
VGA07 db SV,"TSENG",CRLF
VGA08 db SV,"ZyMos",CRLF
VGA09 db SV,"Trident TVGA",CRLF
VGA10 db SV,"8514/A",CRLF
VGAmsgtbl dw EXT00 ;no SVGA
dw VGA00
dw VGA01
dw VGA02
dw VGA03
dw VGA04
dw VGA05
dw VGA06
dw VGA07
dw VGA08
dw VGA09
dw VGA10
spaces db " $" ;three space indentation
VESAmsg db "VESA BIOS present",CRLF
.code
DOSMSG macro msg_offset
mov ah, 9
mov dx, offset msg_offset
int 21h
endm
TYPEmsg macro base, index
xor bx, bx
add bl, [index]
;
;mask out VESA bit in "svgatype" record
; both forms of the AND below are the same
;
; and bl, mask svgabits ;mask bottom 7 bits, or
and bl, not mask vesabit ; don't mask 8th bit
mov si, bx
shl si, 1 ;mult offsets by 2
mov bx, offset base
mov dx, [bx][si]
mov ah, 9
int 21h
endm
INDENT macro num
;
;puts indentations in text printed to screen
;
rept num
mov dx, offset spaces
mov ah, 9
int 21h
endm
endm
DOSMSG copyright
INDENT 1
DOSMSG vid1msg
INDENT 2
DOSMSG std_msg
INDENT 3
TYPEmsg stdmsgtbl, std0type
INDENT 2
DOSMSG ext_msg
INDENT 3
cmp [std0type], 1 ;is it MDA?
je extmono1 ;yes, it's MDA
TYPEmsg vgamsgtbl, ext0type
mov bl, ext0type
and bl, mask vesabit ;was VESA bit set?
je _2nd_vid_adapter ;no VESA
INDENT 3
DOSMSG VESAmsg ;display VESA message
jmp _2nd_vid_adapter
extmono1:
TYPEmsg hgcmsgtbl, ext0type
_2nd_vid_adapter:
INDENT 1
DOSMSG vid2msg
INDENT 2
DOSMSG std_msg
INDENT 3
TYPEmsg stdmsgtbl, std1type
INDENT 2
DOSMSG ext_msg
INDENT 3
cmp [std1type], 1 ;is it MDA or VGA?
je extmono2 ;it's MDA
TYPEmsg vgamsgtbl, ext1type
mov bl, ext1type
and bl, mask vesabit ;was VESA bit set?
je end_display ;no VESA
INDENT 3
DOSMSG VESAmsg ;display VESA message
jmp end_display
extmono2:
TYPEmsg hgcmsgtbl, ext1type
end_display:
call return_errorlevel;return errorlevel
; mov al, [std0type] ;return errorlevel
ret
endp
return_errorlevel proc
comment *
Purpose:
To scan command-line for errorlevel return parameters
eg: vidtype
vidtype e
vidtype 2
vidtype e2
vidtype 2E
Command-line parameters:
none errorlevel based on prim video subsys
"e" errorlevel based on prim ext video code
"2" errorlevel based on sec video subsys
both errorlevel based on sec ext video code
*
.data
cmdln_params record secondary:1, extended:1
cmdflags cmdln_params <0,0>
.code
;
;start parsing the command line
;
lookfor macro char
mov al, char
mov di, 81h
repne scasb
endm
mov si, 80h ;point to command-line in PSP
lodsb ;get length of cmd-line in AL
;
;looking for little "e"
;
push ds
pop es ;ES=DS
xor cx, cx
mov cl, al ;number of interations
push cx ;save CX
lookfor "e"
jne SeekBigE
or [cmdflags], mask extended ;set the flag
jmp SeekTwo ;start looking for "2"
SeekBigE:
;
;looking for big "E"
;
pop cx ;restore CX
push cx ;save it again
lookfor "E"
jne SeekTwo
or [cmdflags], mask extended ;set the flag
SeekTwo:
;
;looking for "2"
;
pop cx ;restore CX
lookfor "2"
jne send_err00
or [cmdflags], mask secondary ;set the flag
send_err00:
cmp [cmdflags], cmdln_params <0,0> ;neither flag set
jne send_err01
mov al, [std0type]
jmp endret_err
send_err01:
cmp [cmdflags], cmdln_params <0,1> ;ext flag set
jne send_err10
mov al, [ext0type]
jmp endret_err
send_err10:
cmp [cmdflags], cmdln_params <1,0> ;sec flag set
jne send_err11
mov al, [std1type]
jmp endret_err
send_err11: ;both ext and sec flags set
mov al, [ext1type]
endret_err:
ret
endp
end start